package com.bosssoft.user.permission.center.serve.controller;



import com.bosssoft.user.permission.center.serve.pojo.dto.ResourceDTO;
import com.bosssoft.user.permission.center.serve.pojo.query.ResourceQuery;
import com.bosssoft.user.permission.center.serve.service.impl.ResourceServiceIml;
import common.annotation.ApiLog;
import common.data.commonresponse.CommonResponse;
import common.util.CommonResponseUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.constraints.NotEmpty;
import java.util.List;

/**
 * <p>
 * 资源 前端控制器
 * </p>
 *
 * @author 郭其鑫
 * @author gqx
 * @since 2024-06-06
 */

@RestController
@Slf4j
@RequestMapping(value = "/api/v1/permission/resource")
@Api(tags="资源有关接口")
@Validated
/*
  资源管理控制器，提供资源的查询、增、删、改等操作接口。
 */
public class ResourceController {
    /**
     * 资源服务接口实例，用于执行具体的数据操作。
     */
    @Resource
    private ResourceServiceIml service;

    /**
     * 分页查询资源信息。
     *
     * @param resourceQuery 查询条件对象，包含分页信息和过滤条件。
     * @return 查询结果的响应对象，包含分页结果和状态信息。
     */
    @GetMapping
    @ApiOperation("资源分页查询")
    @ApiResponse(code = 0, message = "成功", response = CommonResponse.class)
    public CommonResponse<Object> pageQuery(ResourceQuery resourceQuery) {
        log.info("资源分页查询{}", resourceQuery);
        return CommonResponseUtils.success(service.pageQuery(resourceQuery));
    }

    /**
     * 删除资源。
     *
     * @param ids 要删除的资源ID列表。
     * @return 删除操作的结果响应，包含成功或失败的信息。
     */
    @DeleteMapping
    @ApiOperation("资源删除")
    @ApiLog
    @ApiResponse(code = 0, message = "成功", response = CommonResponse.class)
    public CommonResponse<Object> delete(@NotEmpty @RequestBody List<Long> ids) {
        log.info("资源删除{}", ids);
        boolean flag = service.deleteById(ids);
        if (flag) {
            return CommonResponseUtils.success();
        }
        return CommonResponseUtils.failed("删除失败");
    }

    /**
     * 更新资源信息。
     *
     * @param basicResource 要更新的资源对象。
     */
    @PutMapping
    @ApiOperation("资源更新")
    @ApiResponse(code = 0, message = "成功", response = CommonResponse.class)
    public CommonResponse<Boolean> update(ResourceDTO basicResource) {
        log.info("资源更新{}", basicResource);
        service.updateById(basicResource);
        return CommonResponseUtils.success(true);
    }

    /**
     * 保存新资源。
     *
     * @param basicResource 新资源对象。
     */
    @PostMapping
    @ApiOperation("资源保存")
    @ApiResponse(code = 0, message = "成功", response = CommonResponse.class)
    public CommonResponse<Object> save(ResourceDTO basicResource) {
        log.info("资源保存{}", basicResource);
        service.create(basicResource);
        return CommonResponseUtils.success(true);

    }

    /**
     * 批量复制资源。
     *
     * @param list 待复制的资源ID列表。
     * @return 复制操作的结果响应。
     */
    @PostMapping(value = "/copyList")
    @ApiOperation("资源保存")
    @ApiResponse(code = 0, message = "成功", response = CommonResponse.class)
    public CommonResponse<Object> copyList(@RequestBody List<Long> list) {
        log.info("资源保存{}", list);
        return CommonResponseUtils.success(service.copyList(list));
    }

    /**
     * 查询资源列表。
     *
     * @return 资源列表的响应对象。
     */
    @GetMapping(value = "/list")
    @ApiResponse(code = 0, message = "成功", response = CommonResponse.class)
    @ApiLog
    public CommonResponse<Object> getList() {
        log.info("资源列表查询");
        return CommonResponseUtils.success(service.getSubsystemList());
    }

    /**
     * 获取菜单信息。
     *
     * @return 菜单信息的响应对象。
     */
    @GetMapping(value = "/meau")
    @ApiResponse(code = 0, message = "成功", response = CommonResponse.class)
    @ApiLog
    public CommonResponse<Object> getMeau() {
        return CommonResponseUtils.success(service.getMeau());
    }

    /**
     * 获取资源树结构。
     *
     * @return 资源树结构的响应对象。
     */
    @GetMapping(value = "/tree")
    @ApiResponse(code = 0, message = "成功", response = CommonResponse.class)
    @ApiLog
    public CommonResponse<Object> getTree() {
        return CommonResponseUtils.success(service.getTree());
    }

    /**
     * 获取所有父资源名称列表。
     *
     * @return 所有父资源名称列表的响应对象。
     */
    @GetMapping(value = "/nameList")
    @ApiResponse(code = 0, message = "成功", response = CommonResponse.class)
    @ApiLog
    public CommonResponse<Object> getNameList() {
        return CommonResponseUtils.success(service.getAllParent());
    }
}
